package com.cy.pj.sys.pojo.service.imp;

import com.cy.pj.common.annotation.RequiredLog;
import com.cy.pj.common.annotation.RequiredTime;
import com.cy.pj.sys.pojo.dao.SysNoticeDao;
import com.cy.pj.sys.pojo.pojo.SysNotice;
import com.cy.pj.sys.pojo.service.SysNoticeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Service注解由spring提供,一般用于描述分层架构中的业务逻辑对象,这样的类
 * 会交给spring去管理
 */
@Service//交给spring去管理
public  class SysNoticeServiceImpl implements SysNoticeService {

//门面模式
// 使用门面模式的日志框架,有利于维护和各类的日志处理方式统一
    //创建日志门面API对象
    private static final Logger log=
        //通过工厂设计模式过程创建日志对象
            LoggerFactory.getLogger(SysNoticeServiceImpl.class);

   //调用了数据层方法,在业务层里面调用数据层方法执行数据逻辑
    @Autowired
    private SysNoticeDao sysNoticeDao;
    @RequiredLog(operation = "新增公告信息")//我要添加新的公告信息
    @Override
    public int saveNotice(SysNotice notice) {
        int rows = sysNoticeDao.insertNotice(notice);
        return rows;
    }
    //RequiredLog注解描述的方法为日志切入点方法

    /**
     * 如何获取注解中operation属性的值
     * 通过逆向思维了解业务代码
     * 1.要想获取operation属性的值,首先获取operation属性所在的注解对象
     * 2.要想获取@RequiredLog注解对象,需要首先获取注解描述的方法对象
     * 3.要想获取方法(method)对象,首先要获取方法所在的类的字节码对象,如何获取字节码对象
     * 4.要想获取字节码对象,首先需要获取目标信息(target)对象,目标对象可以通过链接点对象获取
     * 获取了字节码对象,通过方法名和参数类型获取具体方法对象,但如何获取方法名和参数类型
     * 5.在AOP中封装方法信息的对象为链接点(JoinPoint)对象,通过此对象获取方法签名后可以拿到方法信息了
     * @param notice
     * @return
     */
    @RequiredLog(operation = "查新公告列表")//给名称//日志切面
   // @RequiredTime
    @Override
    public List<SysNotice> findNotices(SysNotice notice) {
        //开始时间 大括号{}表示占位符后面的时间值写入括号里也就是把日志信息写入大括号里
       // log.debug("start:{}",System.currentTimeMillis());
        String tName = Thread.currentThread().getName();
        System.out.println("SysNoticeService.findNotices.threadName="+tName);
        List<SysNotice> list = sysNoticeDao.selectNotices(notice);
       // log.debug("end:{}",System.currentTimeMillis());//结束时间
        return list;
    }
    @RequiredLog(operation = "删除日志")
    @Override
    public int deleteById(Long... ids) {
        //检查用户权限
        //开启事务
        // log.debug("start:{}",System.currentTimeMillis());
        int rows = sysNoticeDao.deleteById(ids);
        if(rows==0)throw new RuntimeException("记录可能已经不存在了");
        return rows;
    }
    @RequiredLog(operation ="基于id查询通知")
    @RequiredTime//时间切面
    @Override
    public SysNotice findById(Long id) {
        SysNotice notice = sysNoticeDao.selectById(id);
        return notice;
    }

    @Override
    public int updateNotice(SysNotice notice) {
        int rows = sysNoticeDao.updateNotice(notice);
        return rows;
    }
}
